package top.chmin.project.cloud.common.entity.auto;

import org.springframework.stereotype.Repository;
import top.chmin.project.cloud.common.dao.BaseDao;
import top.chmin.project.cloud.common.entity.Condition;
import top.chmin.project.cloud.common.entity.Page;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * chmin
 * 2023-12-27 14:43:40
 * cloud-builder
 */
@Repository
public class EntityDao extends BaseDao<Entity> {

    @Override
    public int save(Entity model) {
        StringBuilder sb = new StringBuilder("INSERT INTO bs_entity(");
// field column auto
// #bind.field.tableName#
        sb.append("table_name,");
// $bind.field.tableName$

// #bind.field.prefix#
        sb.append("prefix,");
// $bind.field.prefix$

// #bind.field.className#
        sb.append("class_name,");
// $bind.field.className$

// #bind.field.module#
        sb.append("module,");
// $bind.field.module$

// #bind.field.pack#
        sb.append("pack,");
// $bind.field.pack$

// #bind.field.path#
        sb.append("path,");
// $bind.field.path$

// #bind.field.remark#
        sb.append("remark,");
// $bind.field.remark$

// #bind.field.tableCode#
        sb.append("table_code,");
// $bind.field.tableCode$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.tableName#
        sb.append("?,"); // table_name
// $bind.field.tableName$

// #bind.field.prefix#
        sb.append("?,"); // prefix
// $bind.field.prefix$

// #bind.field.className#
        sb.append("?,"); // class_name
// $bind.field.className$

// #bind.field.module#
        sb.append("?,"); // module
// $bind.field.module$

// #bind.field.pack#
        sb.append("?,"); // pack
// $bind.field.pack$

// #bind.field.path#
        sb.append("?,"); // path
// $bind.field.path$

// #bind.field.remark#
        sb.append("?,"); // remark
// $bind.field.remark$

// #bind.field.tableCode#
        sb.append("?,"); // table_code
// $bind.field.tableCode$

        sb.append("?,?,?,?");
        sb.append(")");

        return template.update(sb.toString(),
// field value auto
// #bind.field.tableName#
                model.getTableName(),
// $bind.field.tableName$

// #bind.field.prefix#
                model.getPrefix(),
// $bind.field.prefix$

// #bind.field.className#
                model.getClassName(),
// $bind.field.className$

// #bind.field.module#
                model.getModule(),
// $bind.field.module$

// #bind.field.pack#
                model.getPack(),
// $bind.field.pack$

// #bind.field.path#
                model.getPath(),
// $bind.field.path$

// #bind.field.remark#
                model.getRemark(),
// $bind.field.remark$

// #bind.field.tableCode#
                model.getTableCode(),
// $bind.field.tableCode$

                model.getCreateBy(),
                model.getUpdateBy(),
                model.getCreateTime(),
                model.getUpdateTime()
        );
    }

    @Override
    public int save(List<Entity> list) {
        StringBuilder sb = new StringBuilder("INSERT INTO bs_entity(");
// field column auto
// #bind.field.tableName#
        sb.append("table_name,");
// $bind.field.tableName$

// #bind.field.prefix#
        sb.append("prefix,");
// $bind.field.prefix$

// #bind.field.className#
        sb.append("class_name,");
// $bind.field.className$

// #bind.field.module#
        sb.append("module,");
// $bind.field.module$

// #bind.field.pack#
        sb.append("pack,");
// $bind.field.pack$

// #bind.field.path#
        sb.append("path,");
// $bind.field.path$

// #bind.field.remark#
        sb.append("remark,");
// $bind.field.remark$

// #bind.field.tableCode#
        sb.append("table_code,");
// $bind.field.tableCode$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.tableName#
        sb.append("?,"); // table_name
// $bind.field.tableName$

// #bind.field.prefix#
        sb.append("?,"); // prefix
// $bind.field.prefix$

// #bind.field.className#
        sb.append("?,"); // class_name
// $bind.field.className$

// #bind.field.module#
        sb.append("?,"); // module
// $bind.field.module$

// #bind.field.pack#
        sb.append("?,"); // pack
// $bind.field.pack$

// #bind.field.path#
        sb.append("?,"); // path
// $bind.field.path$

// #bind.field.remark#
        sb.append("?,"); // remark
// $bind.field.remark$

// #bind.field.tableCode#
        sb.append("?,"); // table_code
// $bind.field.tableCode$

        sb.append("?,?,?,?");
        sb.append(")");
        return Arrays.stream(template.batchUpdate(sb.toString(),
                list.stream()
                        .map(model -> new Object[]{
// field value auto
// #bind.field.tableName#
                                model.getTableName(),
// $bind.field.tableName$

// #bind.field.prefix#
                                model.getPrefix(),
// $bind.field.prefix$

// #bind.field.className#
                                model.getClassName(),
// $bind.field.className$

// #bind.field.module#
                                model.getModule(),
// $bind.field.module$

// #bind.field.pack#
                                model.getPack(),
// $bind.field.pack$

// #bind.field.path#
                                model.getPath(),
// $bind.field.path$

// #bind.field.remark#
                                model.getRemark(),
// $bind.field.remark$

// #bind.field.tableCode#
                                model.getTableCode(),
// $bind.field.tableCode$

                                model.getCreateBy(),
                                model.getUpdateBy(),
                                model.getCreateTime(),
                                model.getUpdateTime()
                        })
                        .toList()
        )).sum();
    }

    @Override
    public int updateById(Entity model) {
        return updateByCondition(model.getPreCondition().forUpdate().id().eq().toCondition());
    }

    @Override
    public int deleteById(Long id) {
        return deleteByCondition(new EntityFPC().forDelete().id().eq(id).toCondition());
    }

    @Override
    public int deleteById(List<Long> list) {
        return deleteByCondition(new EntityFPC().forDelete().id().in(list).toCondition());
    }

    @Override
    public Entity getById(Long id) {
        return getStreamByCondition(new EntityFPC().id().eq(id).toCondition(), Entity.class).findFirst().orElse(null);
    }

    @Override
    public List<Entity> getListById(List<Long> list) {
        return getStreamByCondition(new EntityFPC().id().in(list).toCondition(), Entity.class).toList();
    }

    @Override
    public Entity getFirst(Condition condition) {
        return getFirst(condition, Entity.class);
    }

    @Override
    public Stream<Entity> getStreamByCondition(Condition condition) {
        return getStreamByCondition(condition, Entity.class);
    }

    @Override
    public Page<Entity> getPageByCondition(Condition condition) {
        return getPageByCondition(condition, Entity.class);
    }
}
